class pubSub{
    constructor(){
        this.event = {};
    }
    // 订阅
    on(type,callback){
        // 一个事件可能存在多个回调函数 使用数组存储
        // 如果事先没有注册事件 就创建一个新数组用于存储
        const callbacks = this.event[type] || [];
        callbacks.push(callback);
        this.event[type] = callbacks;
    }
    // 解除订阅
    off(type,callback){
        if(!this.event[type]){
            return
        }
        // 删除事件上绑定的该函数
        this.event[type] = this.event[type].filter(item=>{
            return item != callback;
        })
    }

    // 发布
    emit(type,...args){
        if(!this.event[type]){
            return;
        }
        // 找出订阅的事件 传递参数 执行函数
        this.event[type].forEach((callback)=>{
            callback.apply(this,args)
        })
    }
    // 执行一次
    once(type, callback){
        function f(){
            callback();
            this.off(type,f)
        }
        this.on(type,f);
    }
}

let obj = new pubSub()
module.exports = obj